using System.ComponentModel.DataAnnotations;

namespace ProduceBasicData.Api.DTO
{
    /// <summary>
    /// 生成编码的请求参数。
    /// 前端点击“编码预览/生成”时提交。
    /// </summary>
    public class GenerateCodeRequest
    {
        /// <summary>
        /// 选择的业务实体的完整限定名。
        /// 由“业务名称”接口返回的 ClassFullName。
        /// </summary>
        [Required]
        public string ClassFullName { get; set; } = string.Empty;

        /// <summary>
        /// 要写入编码的实体属性名。
        /// 由“单据字段”接口选择得到，一般是“系统编码”对应字段。
        /// </summary>
        [Required]
        public string CodeFieldName { get; set; } = string.Empty;

        /// <summary>
        /// 规则类型：年/年月/年月日/无。
        /// 决定是否以及如何把日期片段拼入编码中。
        /// </summary>
        [Required]
        public RuleDateType RuleDateType { get; set; }

        /// <summary>
        /// 增长类型：决定序号从何时开始重置。
        /// DailyReset/MonthlyReset/YearlyReset/Accumulate。
        /// </summary>
        [Required]
        public GrowthType GrowthType { get; set; }

        /// <summary>
        /// 用于重置范围的日期字段名（如 CreateTime/UpdateTime）。
        /// 当 GrowthType 为 Accumulate 时可为空。
        /// </summary>
        public string? DateFieldName { get; set; }

        /// <summary>
        /// 编码前缀。由用户输入，例如："P"、"WO"。
        /// </summary>
        [Required]
        public string Prefix { get; set; } = string.Empty;

        /// <summary>
        /// 序号位数（1-4）。用于左侧补零。
        /// </summary>
        [Range(1, 4)]
        public int Digits { get; set; } = 4;
    }

    /// <summary>
    /// 生成编码的响应。
    /// </summary>
    public class GenerateCodeResponse
    {
        public string Code { get; set; } = string.Empty;
    }

    /// <summary>
    /// 将编码写入指定记录的请求。
    /// </summary>
    public class AssignCodeRequest
    {
        /// <summary>
        /// 业务实体限定名。
        /// </summary>
        [Required]
        public string ClassFullName { get; set; } = string.Empty;

        /// <summary>
        /// 编码字段名。
        /// </summary>
        [Required]
        public string CodeFieldName { get; set; } = string.Empty;

        /// <summary>
        /// 要写入的那条记录的主键 Id。
        /// </summary>
        [Required]
        public int Id { get; set; }

        /// <summary>
        /// 要写入数据库的编码内容。
        /// 一般来自 Generate 接口的结果。
        /// </summary>
        [Required]
        public string Code { get; set; } = string.Empty;
    }

    
}


